/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.inve.manager;

import com.brain.conf.dto.AlmacenDto;
import com.brain.conf.manager.*;
import com.brain.core.common.ExportarExcelInve;
import com.brain.core.manager.*;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ConstantesCore;
import com.brain.inve.dto.IntercambioUbicaDetaDto;
import com.brain.inve.dto.IntercambioUbicaDto;
import com.brain.inve.dto.IuDetaItemDto;
import com.brain.inve.dto.StockDto;
import com.brain.inve.view.util.ConstantesInve;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import net.sf.jasperreports.engine.JRException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class IntercambioUbicaManager extends ComunManager<IntercambioUbicaDto> implements Serializable {

    private static Logger logger = Logger.getLogger(IntercambioUbicaManager.class);
    private Long idEntidad = 190L;
    private Long idCatalogoMotivosSinOrigen = 356L;
    private Long idCatalogoMotivosConOrigen = 355L;
    @Resource
    private DAOGenerico<IntercambioUbicaDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private ApplicationMBean applicationMBean;
    @Resource
    private AlmacenUbicacionManager auManager;
    private final String urlLista = "/pages/inve/intercambioUbica/listaIntercambiosUbica.xhtml";
    private final String url = "/pages/inve/intercambioUbica/intercambioUbica.xhtml";

    /**
     * obtener Intercambio Ubica por Id
     *
     * @param id
     * @return Intercambio Ubica
     * @throws DAOException
     */
    public IntercambioUbicaDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(IntercambioUbicaDto.class, id);
    }

    /**
     * Metodo para inicializar nueva Guia de Remision
     *
     * @return
     */
    public IntercambioUbicaDto inicializar() {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        IntercambioUbicaDto dto = new IntercambioUbicaDto();
        AlmacenDto almDto = obtenerAlmacenPorDefault();
        dto.setEmpresaDto(sessionMBean.getEmpresaDto());
        dto.setFechaEmision(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setEstado(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_ELABORACION);
        dto.setAlmacenDto(almDto);
        dto.setDireccionAlmacen(almDto.getDireccion());
        if (sessionMBean.getOrganizacionDto() != null) {
            if (sessionMBean.getOrganizacionDto().getId() != null) {
                dto.setOrganizacionDto(sessionMBean.getOrganizacionDto());
            }
        }
        dto.setListaDetalles(new ArrayList<IntercambioUbicaDetaDto>());
        return dto;
    }

    /**
     * Metodo para obtener Intercambio Ubicacion segun filtro
     *
     * @param dtoFiltro
     * @return Lista de Intercambio Ubicacion
     * @throws DAOException
     */
    public List<IntercambioUbicaDto> obtener(IntercambioUbicaDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from IntercambioUbicaDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescripcion() != null && dtoFiltro.getDescripcion().length() != 0) {
            hqsql += " and upper(e.descripcion) like '%" + dtoFiltro.getDescripcion().toUpperCase() + "%'";
        }

        if (dtoFiltro.getEstado() != null && dtoFiltro.getEstado().length() != 0 && !dtoFiltro.getEstado().equals(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_TODOS)) {
            hqsql += " and upper(e.estado) = '" + dtoFiltro.getEstado() + "'";
        }

        if (dtoFiltro.getDescAlmacen() != null && dtoFiltro.getDescAlmacen().length() != 0) {
            hqsql += " and (upper(e.almacenDto.nombre) like '%" + dtoFiltro.getDescAlmacen().toUpperCase() + "%')";
        }

        if (dtoFiltro.getIdProducto() != null && !dtoFiltro.getIdProducto().equals(0L)) {
            hqsql += " and exists (select 'X' from IntercambioUbicaDetaDto as d where d.intercambioUbicaDto.id = e.id and d.productoDto.id = ? )";
            listaParametros.add(dtoFiltro.getIdProducto());
        }

        if (dtoFiltro.getDescProducto() != null && dtoFiltro.getDescProducto().length() != 0) {
            hqsql += " and exists (select 'X' from IntercambioUbicaDetaDto as d where d.intercambioUbicaDto.id = e.id and (upper(d.productoDetaDto.productoDto.descripcion) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper(d.productoDetaDto.sku) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper(d.productoDetaDto.productoDto.descripcionCorta) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper(d.productoDetaDto.productoDto.descripcionDetalle) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper(d.productoDetaDto.productoDto.descripcionIdioma1) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper(d.productoDetaDto.productoDto.descripcionIdioma2) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += "))";
        }

        if (dtoFiltro.getFechaInicio() != null && dtoFiltro.getFechaFin() != null) {
            hqsql += " and e.fechaEmision between ? and ?";
            Calendar c = Calendar.getInstance();
            c.setTime(dtoFiltro.getFechaInicio());
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            listaParametros.add(c.getTime());
            c.setTime(dtoFiltro.getFechaFin());
            c.set(Calendar.HOUR, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            listaParametros.add(c.getTime());
        }

        if (dtoFiltro.getFechaTrasladoInicio() != null && dtoFiltro.getFechaTrasladoFin() != null) {
            hqsql += " and e.fechaInicioTraslado between ? and ?";
            Calendar c = Calendar.getInstance();
            c.setTime(dtoFiltro.getFechaTrasladoInicio());
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            listaParametros.add(c.getTime());
            c.setTime(dtoFiltro.getFechaTrasladoFin());
            c.set(Calendar.HOUR, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            listaParametros.add(c.getTime());
        }
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }

        hqsql += " order by e.fechaEmision  desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo para guardar, editar Intercambio Ubicacion
     *
     * @param dto Intercambio Ubicacion
     * @return cadena de satisfaccion
     */
    public String guardar(IntercambioUbicaDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        try {
            if (dto.getOrganizacionDto() != null) {
                {
                    dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
                    dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                    dto.setTerminal(sessionMBean.getSessionTerminal());
                }

                Boolean indicador = true;

                if (dto.getId() != null && dto.getEstado().equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_CONFIRMADO)) {
                    //Verificamos si tiene al menos un detalle
                    if (!verificarDetalles(dto)) {
                        to = null;
                        indicador = false;
                    }
                }
                //Verificamos si todos los detalles tienen al menos un almacen ubicacion 
                if (!verificarAlmacenUbicacionEnDetalles(dto)) {
                    to = null;
                    indicador = false;
                }
                if (indicador) {
                    definirCssPorEstado(dto);
                    if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
                        dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                        dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                        dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                        UtilCore.General.toUpperCaseDto(dto);
                        nuevo(dto);

                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                        recursosManager.showMessage(mensajeTrx);

                        to = "";//retroceder();

                    } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                        //Verificamos si se trata de una confirmacion
                        if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_CONFIRMADO)) {
                            indicador = verificarDatosAntesDeConfirmar(dto);
                        }
                        if (indicador) {
                            UtilCore.General.toUpperCaseDto(dto);
                            editar(dto);
                            mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                            recursosManager.showMessage(mensajeTrx);
                            to = "";//retroceder();
                        } else {
                            to = null;
                        }
                    }


                } else {
                    to = null;
                }
            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.no.organizacion");
                recursosManager.showError(mensajeTrx);
                to = null;
            }
        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);

            to = null;
        }
        return to;
    }
    
    public String obtenerCadenaUltimaModificacionLista(IntercambioUbicaDto dto) {
        String cad = "";
        int diasDif = UtilCore.Fecha.diferenciaDiasFechas(dto.getFecha(), UtilCore.Fecha.obtenerFechaActualDate());
        if (diasDif == 0) {
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.hoy.a.las") + " " + sdf.format(dto.getFecha());            
        }
        else if (diasDif == 1) {
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.ayer.a.las") + " " + sdf.format(dto.getFecha());
        }
        else if (diasDif >1 && diasDif < 7) {
            int diaSemana = 0;
            String diaTexto = "";
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(UtilCore.Fecha.obtenerFechaActualDate());;
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            if (calendario.get(Calendar.DAY_OF_WEEK) > diasDif) {
                diaSemana = calendario.get(Calendar.DAY_OF_WEEK) - diasDif;
            }
            else {
                diaSemana = 7 - Math.abs(calendario.get(Calendar.DAY_OF_WEEK) - diasDif);                
            }
            diaTexto = obtenerDiaSemanaTexto(diaSemana);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.el") + " " + diaTexto + " " + sdf.format(dto.getFecha());
        }
        else {
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(dto.getFecha());
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.hace") + " " + UtilCore.Fecha.diferenciaDiasFechas(dto.getFecha(), UtilCore.Fecha.obtenerFechaActualDate()) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.dias");
        }
        return cad;
    }
    
    public String obtenerEstadoCadena(IntercambioUbicaDto dto) {
        String cad = "";
        if (dto.getFecha().after(dto.getFechaCreacion())) {
            if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_ELABORACION)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.modificado");
            }
            else if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_ANULADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.anulado");
            }
            else if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_CONFIRMADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.confirmado");
            }
        }
        else {
            cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.creado");
        }
        return cad;
    }
    
    public String obtenerDiaSemanaTexto(int dia) {
        String[] diasSemana = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.domingo.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.lunes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.martes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.miercoles.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.jueves.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.viernes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.sabado.a.las")
        };
        return diasSemana[dia-1];
    }
    
    public String obtenerMesTexto(int mes) {
        String[] meses = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.enero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.febrero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.marzo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.abril"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.mayo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.junio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.julio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.agosto"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.setiembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.octubre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.noviembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.diciembre")            
        };
        return meses[mes];
    }

    public String revisarValidacinoesAntesDeGuardar(IntercambioUbicaDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        try {
            if (dto.getOrganizacionDto() != null) {
                Boolean indicador = true;

                if (dto.getId() != null && dto.getEstado().equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_CONFIRMADO)) {
                    //Verificamos si tiene al menos un detalle
                    if (!verificarDetalles(dto)) {
                        to = null;
                        indicador = false;
                    }
                }
                //Verificamos si todos los detalles tienen al menos un almacen ubicacion 
                if (!verificarAlmacenUbicacionEnDetalles(dto)) {
                    to = null;
                    indicador = false;
                }
                if (indicador) {
                    if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                        //Verificamos si se trata de una confirmacion
                        if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_CONFIRMADO)) {
                            indicador = verificarDatosAntesDeConfirmar(dto);
                        }
                        if (indicador) {
                            to = "";//retroceder();
                        } else {
                            to = null;
                        }
                    }


                } else {
                    to = null;
                }
            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.no.organizacion");
                recursosManager.showError(mensajeTrx);
                to = null;
            }
        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);

            to = null;
        }
        return to;
    }

    public void definirCssPorEstado(IntercambioUbicaDto dto) {
        if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_ELABORACION)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssElaboracion);
        } else if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_ANULADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssAnulado);
        } else if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_CONFIRMADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssConfirmado);
        }
    }

    public Boolean validarDatosIuDetaItem(IuDetaItemDto iuDetaDto) {
        Boolean resultado = true;
        if (!iuDetaDto.getAlmacenUbicacionOrigenDto().equals(iuDetaDto.getAlmacenUbicacionDestinoDto())) {
            if (iuDetaDto.getCantidadMovida() != null) {
                if (iuDetaDto.getCantidadMovida().compareTo(BigDecimal.ZERO) <= 0) {
                    resultado = false;
                    recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.19"));
                }
            } else {
                resultado = false;
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.19"));
            }
        } else {
            resultado = false;
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.mensaje.3"));
        }
        return resultado;
    }

    public Boolean verificarDatosAntesDeConfirmar(IntercambioUbicaDto dto) {
        Boolean resultado = true;
        //Primero verificamos el stock para cada detalle que se va intercambiar
        for (IntercambioUbicaDetaDto hijo : dto.getListaDetalles()) {
            for (IuDetaItemDto item : hijo.getListaDetalles()) {
                resultado = resultado && verificarStock(hijo, item);
            }
        }
        return resultado;
    }

    public Boolean verificarStock(IntercambioUbicaDetaDto detaDto, IuDetaItemDto iuDetaDto) {
        Boolean resultado = true;
        try {
            StockManager stockManager = (StockManager) WebServletContextListener.getApplicationContext().getBean("stockManager");
            //Verificamos si el stock del almacen ubicacion tiene la cantidad de producto suficientes
            List<StockDto> lstStock = stockManager.obtenerStockPorAlmUbiYProducto(detaDto, iuDetaDto.getAlmacenUbicacionOrigenDto());

            if (lstStock != null && !lstStock.isEmpty()) {
                StockDto stockDto = lstStock.get(0);
                if (iuDetaDto.getCantidadMovida().compareTo(stockDto.getCantidad()) > 0) {
                    if (!detaDto.getProductoDetaDto().getVentaSinStock()) {
                        resultado = false;
                        recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.no.stock1") + " " + detaDto.getProductoDetaDto().getProductoDto().getDescripcion() + " " + UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.no.stock2"));
                    }
                }
            } else {
                if (!detaDto.getProductoDetaDto().getVentaSinStock()) {
                    resultado = false;
                    recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.no.stock1") + " " + detaDto.getProductoDetaDto().getProductoDto().getDescripcion() + " " + UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.no.stock2"));
                }
            }
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
        return resultado;
    }

    public BigDecimal sumarCantidadDetalles(List<IntercambioUbicaDetaDto> lst) {
        BigDecimal suma = BigDecimal.ZERO;
        if (lst != null) {
            for (IntercambioUbicaDetaDto x : lst) {
                suma = suma.add(x.getCantidadMovida());
            }
        }
        return suma;
    }

    public Boolean verificarDetalles(IntercambioUbicaDto dto) {
        if (dto.getListaDetalles() != null) {
            if (!dto.getListaDetalles().isEmpty() && dto.getListaDetalles().size() > 0) {
                return true;
            } else {
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.mensaje.no.detalles"));
            }
        } else {
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.mensaje.no.detalles"));
        }
        return false;
    }

    public Boolean verificarAlmacenUbicacionEnDetalles(IntercambioUbicaDto dto) {
        Boolean resultado = true;
        if (dto.getListaDetalles() != null) {
            if (!dto.getListaDetalles().isEmpty()) {
                for (IntercambioUbicaDetaDto x : dto.getListaDetalles()) {
                    if (x.getListaDetalles() == null) {
                        resultado = false;
                        recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.3") + " " + x.getProductoDetaDto().getProductoDto().getDescripcion());
                    } else {
                        if (x.getListaDetalles().isEmpty()) {
                            resultado = false;
                            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.3") + " " + x.getProductoDetaDto().getProductoDto().getDescripcion());
                        } else {
                            //Verificamos que las ubicacion pertenezcan al almacen del movimiento
                            for (IuDetaItemDto grDetaDto : x.getListaDetalles()) {
                                if (!dto.getAlmacenDto().equals(grDetaDto.getAlmacenUbicacionOrigenDto().getAlmacenDto()) || !dto.getAlmacenDto().equals(grDetaDto.getAlmacenUbicacionDestinoDto().getAlmacenDto())) {
                                    resultado = false;
                                    recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.mensaje.1") + " " + x.getProductoDetaDto().getProductoDto().getDescripcion() + " / " + UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.22") + " " + grDetaDto.getAlmacenUbicacionDestinoDto().getNombre());
                                }
                            }
                        }
                    }
                }
            }
        }
        return resultado;
    }

    public void reordenarDetalles(IntercambioUbicaDto dto) {
        List<IntercambioUbicaDetaDto> lstDetalles = dto.getListaDetalles();
        IntercambioUbicaDetaManager intercambioUbicaDetaManager = (IntercambioUbicaDetaManager) WebServletContextListener.getApplicationContext().getBean("intercambioUbicaDetaManager");
        try {
            UtilCore.General.ordena(lstDetalles, "item");
            int count = 0;
            for (IntercambioUbicaDetaDto d : lstDetalles) {
                count++;
                d.setItem(count);
            }
            if (dto.getId() != null) {
                intercambioUbicaDetaManager.nuevoMuchos(lstDetalles);
            }
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
    }

    public SelectItem[] siEstadosIntercambioUbicacTodos() {
        SelectItem[] si = new SelectItem[4];
        si[0] = new SelectItem(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_ELABORACION, ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_DESC_ESTADO_ELABORACION);
        si[1] = new SelectItem(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_CONFIRMADO, ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_DESC_ESTADO_CONFIRMADO);
        si[2] = new SelectItem(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_ANULADO, ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_DESC_ESTADO_ANULADO);
        si[3] = new SelectItem(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_TODOS, ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_DESC_ESTADO_TODOS);
        return si;
    }

    private AlmacenDto obtenerAlmacenPorDefault() {
        AlmacenDto almDto = null;
        try {
            AlmacenManager almacenManager = (AlmacenManager) WebServletContextListener.getApplicationContext().getBean("almacenManager");
            List<AlmacenDto> listaAlmacenes = almacenManager.obtenerAlmacenesActivosPorOrganizacion();
            almDto = listaAlmacenes.get(0);
        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());

        }
        return almDto;
    }

    public Boolean verificarAlmacenUbicacionPorDetalle(IntercambioUbicaDto dto, IntercambioUbicaDetaDto detaDto) {
        Boolean resultado = true;
        if (detaDto.getListaDetalles() == null) {
            resultado = false;
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.2"));
        } else {
            if (detaDto.getListaDetalles().isEmpty()) {
                resultado = false;
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.2"));
            }
        }
        //Si al menos se ha agregado un IuDetaItem verificamos que se haya indicado en que almacen 
        //ubicacion ira toda la cantidad movida del detalle
        if (resultado) {
            BigDecimal cantidadTotal = BigDecimal.ZERO;
            for (IuDetaItemDto x : detaDto.getListaDetalles()) {
                cantidadTotal = cantidadTotal.add(x.getCantidadMovida());
            }
            if (detaDto.getCantidadMovida().compareTo(cantidadTotal) > 0 || cantidadTotal.compareTo(detaDto.getCantidadMovida()) > 0) {
                resultado = false;
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.12"));
            }
        }
        return resultado;
    }

    public void editarIuDetaItem(IntercambioUbicaDto dto, IntercambioUbicaDetaDto detaDto, int contIndex) {
        IuDetaItemDto iuDetaItemDto = detaDto.getListaDetalles().get(contIndex);
        if (iuDetaItemDto.getCantidadMovida() != null) {
            if (validarSumaCantidadesAlmUbicacionEditar(detaDto, iuDetaItemDto, contIndex)) {
                verificarStock(detaDto, iuDetaItemDto);
            }
        } else {
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.19"));
        }
    }

    public void agregarIuDetaItem(IntercambioUbicaDto dto, IntercambioUbicaDetaDto detaDto, IuDetaItemDto iuDetaDto) {
        if (detaDto.getProductoDetaDto() != null) {
            if (detaDto.getCantidadMovida() != null) {
                Boolean indicador = true;
                if (detaDto.getListaDetalles() == null) {
                    detaDto.setListaDetalles(new ArrayList<IuDetaItemDto>());
                }
                if (verificarUniqueAlmacenUbicacionPorDetalle(detaDto, iuDetaDto)) {
                    if (validarSumaCantidadesAlmUbicacionNuevo(detaDto, iuDetaDto)) {
                        indicador = verificarStock(detaDto, iuDetaDto);
                    } else {
                        indicador = false;
                    }

                    if (indicador) {
                        iuDetaDto.setIntercambioUbicaDetaDto(detaDto);
                        detaDto.getListaDetalles().add(iuDetaDto);
                    }
                }
            } else {
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.7"));
            }
        } else {
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.6"));
        }
    }

    public Boolean verificarUniqueAlmacenUbicacionPorDetalle(IntercambioUbicaDetaDto detaDto, IuDetaItemDto iuDetaDto) {
        Boolean resultado = true;

        for (IuDetaItemDto x : detaDto.getListaDetalles()) {
            if (x.getAlmacenUbicacionOrigenDto().equals(iuDetaDto.getAlmacenUbicacionOrigenDto()) && x.getAlmacenUbicacionDestinoDto().equals(iuDetaDto.getAlmacenUbicacionDestinoDto())) {
                resultado = false;
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.13"));
            }
        }

        return resultado;
    }

    public Boolean validarSumaCantidadesAlmUbicacionEditar(IntercambioUbicaDetaDto detaDto, IuDetaItemDto iuDetaDto, int contIndex) {
        Boolean resultado = true;
        BigDecimal cantidadTotal = BigDecimal.ZERO;
        if (detaDto.getListaDetalles() != null) {
            if (!detaDto.getListaDetalles().isEmpty()) {
                int cont = 0;
                for (IuDetaItemDto x : detaDto.getListaDetalles()) {
                    if (cont != contIndex) {
                        cantidadTotal = cantidadTotal.add(x.getCantidadMovida());
                    }
                    cont++;
                }
            }
        }
        cantidadTotal = cantidadTotal.add(iuDetaDto.getCantidadMovida());
        if (cantidadTotal.compareTo(detaDto.getCantidadMovida()) > 0) {
            resultado = false;
            recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.1"));
        }
        return resultado;
    }

    public Boolean validarSumaCantidadesAlmUbicacionNuevo(IntercambioUbicaDetaDto detaDto, IuDetaItemDto iuDetaDto) {
        Boolean resultado = true;
        BigDecimal cantidadTotal = BigDecimal.ZERO;
        if (detaDto.getListaDetalles() != null) {
            if (!detaDto.getListaDetalles().isEmpty()) {
                for (IuDetaItemDto x : detaDto.getListaDetalles()) {
                    cantidadTotal = cantidadTotal.add(x.getCantidadMovida());
                }
            }
        }
        cantidadTotal = cantidadTotal.add(iuDetaDto.getCantidadMovida());

        if (cantidadTotal.compareTo(detaDto.getCantidadMovida()) > 0) {
            resultado = false;
            recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.1"));
        }
        return resultado;
    }

    public String imprimirDto(IntercambioUbicaDto dto) {
        try {
            String nombreArchivoReporte = "ERP_INTERCAMBIO_UBICA_" + dto.getId();
            HashMap parametros = new HashMap();
            parametros.put("P_IDENTIFICADOR", dto.getId());
            recursosManager.viewReportePdf(parametros, "JIntercambioUbica", nombreArchivoReporte);
            return null;
        } catch (FileNotFoundException ex) {
            recursosManager.showError("EL ARCHIVO NO SE ENCUENTRA");
            logger.error(ex);
        } catch (JRException ex) {
            logger.error(ex);
            recursosManager.showError("ERROR EN LA COMPILACIÓN DEL REPORTE");
        } catch (IOException ex) {
            recursosManager.showError("EL ARCHIVO ESTÁ DAÑADO");
            logger.error(ex);
        } catch (SQLException ex) {
            logger.error(ex);
            recursosManager.showError("ERROR EN LA CONSULTA DEL REPORTE");
        } finally {
            return null;
        }
    }

    public void generarExcelSeleccionados(ExportarExcelInve.IntercambioUbicacion exp, IntercambioUbicaDto[] selectedIUs) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List<IntercambioUbicaDto> lst = Arrays.asList(selectedIUs);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lst);
        String nombreArchivo = "INTERCAMBIO_UBICACION_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }

    public void generarExcelPorTabla(ExportarExcelInve.IntercambioUbicacion exp, List<IntercambioUbicaDto> lstIU) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lstIU);
        String nombreArchivo = "INTERCAMBIO_UBICACION_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }

    private List obtenerCuerpoExcel(ExportarExcelInve.IntercambioUbicacion exp, List<IntercambioUbicaDto> lst) {
        StringBuilder strCuerpo;
        List lstFilas = new ArrayList();
        for (IntercambioUbicaDto x : lst) {
            strCuerpo = new StringBuilder();
            if (exp.getId()) {
                if (x.getId() != null) {
                    strCuerpo.append(x.getId()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getEmpresa()) {
                if (x.getEmpresaDto() != null) {
                    strCuerpo.append(x.getEmpresaDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getOrganizacion()) {
                if (x.getOrganizacionDto() != null) {
                    strCuerpo.append(x.getOrganizacionDto().getNombre()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaEmision()) {
                if (x.getFechaEmision() != null) {
                    strCuerpo.append(x.getFechaEmision()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaInicioTraslado()) {
                if (x.getFechaInicioTraslado() != null) {
                    strCuerpo.append(x.getFechaInicioTraslado()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getDescripcion()) {
                if (x.getDescripcion() != null) {
                    strCuerpo.append(x.getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getAlmacen()) {
                if (x.getAlmacenDto() != null) {
                    strCuerpo.append(x.getAlmacenDto().getNombre()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioCreacion()) {
                if (x.getUsuarioCreacionDto() != null) {
                    strCuerpo.append(x.getUsuarioCreacionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaCreacion()) {
                if (x.getFechaCreacion() != null) {
                    strCuerpo.append(x.getFechaCreacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getTerminalCreacion()) {
                if (x.getTerminalCreacion() != null) {
                    strCuerpo.append(x.getTerminalCreacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioConfirmacion()) {
                if (x.getUsuarioCreacionDto() != null) {
                    strCuerpo.append(x.getUsuarioCreacionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaConfirmacion()) {
                if (x.getFechaConfirmacion() != null) {
                    strCuerpo.append(x.getFechaConfirmacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioAnulacion()) {
                if (x.getUsuarioAnulacionDto() != null) {
                    strCuerpo.append(x.getUsuarioAnulacionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaAnulacion()) {
                if (x.getFechaAnulacion() != null) {
                    strCuerpo.append(x.getFechaAnulacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getEstado()) {
                if (x.getEstado() != null) {
                    strCuerpo.append(x.getEstadoTexto()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getDireccionAlmacen()) {
                if (x.getDireccionAlmacen() != null) {
                    strCuerpo.append(x.getDireccionAlmacen()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getMotivo()) {
                if (x.getMotivoDto() != null) {
                    strCuerpo.append(x.getMotivoDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getComentarioMotivo()) {
                if (x.getComentarioMotivo() != null) {
                    strCuerpo.append(x.getComentarioMotivo()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            lstFilas.add(strCuerpo.toString());
        }
        return lstFilas;
    }

    private StringBuilder obtenerCabeceraExcel(ExportarExcelInve.IntercambioUbicacion exp) {
        StringBuilder strCabecera = new StringBuilder();
        if (exp.getId()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.id")).append("|");
        }
        if (exp.getEmpresa()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.empresa")).append("|");
        }
        if (exp.getOrganizacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.organizacion")).append("|");
        }
        if (exp.getFechaEmision()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.fecha.emision")).append("|");
        }
        if (exp.getFechaInicioTraslado()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.fecha_ini_traslado")).append("|");
        }
        if (exp.getDescripcion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.descripcion")).append("|");
        }
        if (exp.getAlmacen()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.almacen")).append("|");
        }
        if (exp.getUsuarioCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("genral.label.usuario.creacion")).append("|");
        }
        if (exp.getFechaCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.fecha.creacion")).append("|");
        }
        if (exp.getTerminalCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.terminal.creacion")).append("|");
        }
        if (exp.getUsuarioConfirmacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.usuario.confirmacion")).append("|");
        }
        if (exp.getFechaConfirmacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.fecha.confirmacion")).append("|");
        }
        if (exp.getUsuarioAnulacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.usuario.anulacion")).append("|");
        }
        if (exp.getFechaAnulacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.fecha.anulacion")).append("|");
        }
        if (exp.getEstado()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.estado")).append("|");
        }
        if (exp.getDireccionAlmacen()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.direccion.almacen")).append("|");
        }
        if (exp.getMotivo()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.motivo")).append("|");
        }
        if (exp.getComentarioMotivo()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("intercambio.ubica.comentario.motivo")).append("|");
        }
        return strCabecera;
    }

    public ExportarExcelInve.IntercambioUbicacion onChangeChekExcel(Boolean flag) {
        return new ExportarExcelInve.IntercambioUbicacion(flag);
    }

    public void nuevoMuchos(List<IntercambioUbicaDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }

    public void eliminarMuchos(List<IntercambioUbicaDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        IntercambioUbicaManager.logger = logger;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public DAOGenerico<IntercambioUbicaDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<IntercambioUbicaDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getUrlLista() {
        return urlLista;
    }

    public String getUrl() {
        return url;
    }

    public Long getIdCatalogoMotivosSinOrigen() {
        return idCatalogoMotivosSinOrigen;
    }

    public Long getIdCatalogoMotivosConOrigen() {
        return idCatalogoMotivosConOrigen;
    }
}
